package createpattern.singletonpattern.lazy;
/**
 * 懒汉式3 - 双重检查模式
 * 双重检查锁模式是一种非常好的单例实现模式，解决了单例、性能、线程安全问题，上面的双重检
 * 测锁模式看上去完美无缺，其实是存在问题，在多线程的情况下，可能会出现空指针问题，出现问
 * 题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。
 * */
public class Singleton3 {

    private Singleton3(){}

    private static Singleton3 instance;

    public static Singleton3 getInstance() {
        // 双重检查,在判空后加锁,再次进行空判断,没问题再创建实例
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }

}
